#ifndef __LIST_H__
#define __LIST_H__

#include "microThread.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 功能：
 *       初始化链表节点
 * 参数：
 *       l 链表节点；可以是链表头，可以是普通节点
 * 返回：
 *       无
 */
#define mt_list_init(l)          \
do{                              \
    (l)->next = (l)->prev = (l); \
}while(0)

/**
 * 功能：
 *       在节点l的后面插入一个节点
 * 参数：
 *       l 一个链表节点；一般是链表头，也可以是普通节点，如果为链表头则是在链表开头插入一个节点
 *       n 插入的新节点
 * 返回：
 *       无
 */
#define mt_list_insert_after(l, n) \
do{                                \
    (l)->next->prev = (n);         \
    (n)->next = (l)->next;         \
                                   \
    (l)->next = (n);               \
    (n)->prev = (l);               \
}while(0)

/**
 * 功能：
 *       在节点l的前面插入一个节点
 * 参数：
 *       l 一个链表节点；一般是链表头，也可以是普通节点，如果为链表头则是在链表尾部插入一个节点
 *       n 插入的新节点
 * 返回：
 *       无
 */
#define mt_list_insert_before(l, n) \
do{                                 \
    (l)->prev->next = (n);          \
    (n)->prev = (l)->prev;          \
                                    \
    (l)->prev = (n);                \
    (n)->next = (l);                \
}while(0)

/**
 * 功能：
 *       将节点从某个链表中删除
 * 参数：
 *       n 要删除的节点，不能是链表头
 * 返回：
 *       无
 */
#define mt_list_remove(n)        \
do{                              \
    (n)->next->prev = (n)->prev; \
    (n)->prev->next = (n)->next; \
                                 \
    (n)->next = (n)->prev = (n); \
}while(0)

/**
 * 功能：
 *       判断链表是否为空
 * 参数：
 *       l 一个链表节点；一般是链表头，也可以是普通节点，如果是普通节点则是判断该节点是否孤立
 * 返回：
 *       空返回 OS_TRUE，非空返回 OS_FALSE
 */
#define mt_list_isempty(l)                 \
({                                         \
    (l)->next == (l) ? MT_TRUE : MT_FALSE; \
})


/**
 * 功能：
 *       获取链表长度
 * 参数：
 *       l 一个链表节点；一般是链表头
 * 返回：
 *       返回链表长度
 */
#define mt_list_len(l)        \
({                            \
    mt_uint32_t len = 0;      \
    const mt_list_t *p = (l); \
                              \
    while(p->next != (l))     \
    {                         \
        p = p->next;          \
        len ++;               \
    }                         \
                              \
    len;                      \
})

/*
 * 功能：
 *       实现链表的遍历
 * 参数：
 *       pos 用于循环的中间变量，每次遍历到的节点都通过该指针获取
 *       head 链表头
 * 说明：
 *       该宏定义用于简化链表的遍历
 */
#define mt_list_for_each(pos, head) \
    for((pos) = (head)->next; (pos) != (head); (pos) = (pos)->next)


#ifdef __cplusplus
}
#endif

#endif
